/*
 * mobile select
 * 13.09.22
 */

/**
 * 参数：
 * server:请求action
 * catalog:newtouchone框架字典大类名
 * localData:本地数据
 * 1.[{code:"",name:"",selected:true}](单联)
 * 2.[{code:"",name:"",id:"",parentId:""}](级联)
 * 
 * options:下拉框主题类型设置
 */
var localDataTest=[];
(function($){
	
	/*
	 * mobileselect 渲染接口
	 * params：参数配置
	 * callback:回调函数配置
	 */
	
	$.fn.mobileSelect=function(params,callback){
		//限定page容器
//		var pagecontainer=$(this).closest(".ui-page");
		var self=this.element=$(this);
		//控件指定
		var selectId=$(this).attr("id");
		if(!selectId)
			selectId=$(this).attr("name");
		if(selectId==undefined)
		    return;
		
		
		
		//初始化控件
		if(!params){
			if($(">option",self).length==0){
				var strHtml="<option value=''>请选择</option>"
				self.html(strHtml);
			}
			self.mobiscroll().select(selectOption1);
		}
		
		//本地交互
		else if(params.localData){
			renderSelect(params,self,params.localData,undefined);
			//回调函数
			$.when(renderCascadeSelect(params,self)).then(
					function(){
						if(params.defaultVal){
							var value={value:params.defaultVal};
							$("#"+selectId).selectSetValue(value);
						}
						
						if(callback)
							callback();
					});
			
		}
		
		//ajax交互
		//im组件调用
		else if(params.catalog){
				var dictionaryData;
				params.xpath=params.catalog;
				params.ajaxData=queryDictionary(params,dictionaryData);
				renderSelect(params,self,undefined,params.ajaxData);
				//回调函数
				$.when(renderCascadeSelect(params,self)).then(
						function(){
							if(params.defaultVal){
								var value={value:params.defaultVal};
								$("#"+selectId).selectSetValue(value);
							}
							
							if(callback)
								callback();
						});
			
		}
		
		
		
	};
	/*
	 *  设置select选中值
	 *  
	 *  bindings：初始化选中时配置{value:""}
	 */
	
	$.fn.selectSetValue=function(bindings){
		 var self=this.element=$(this);
		//控件指定
			var selectId=$(this).attr("id");
			if(!selectId)
				selectId=$(this).attr("name");
			if(selectId==undefined)
			    return;
		 if(bindings){
			 self.find("option[value='"+bindings.value+"']")[0].selected=true;
			 var defaultvalue=$("#"+selectId).find("option[value='"+bindings.value+"']").text();
			 self.prev("input").val(defaultvalue);
			 self.mobiscroll("setValue",bindings.value);
			 self.trigger("change");
		 }
		
	};
	/*
	 * 获取select选中值
	 */
	$.fn.selectGetValue=function(){
		var self=this.element=$(this);
		//控件指定
		var selectId=$(this).attr("id");
		if(!selectId)
			selectId=$(this).attr("name");
		if(selectId==undefined)
		    return;
		var value= self.mobiscroll("getValue");
		return value;
	};
	
  
//渲染select控件
var renderSelect=function(p,$select,localData,ajaxData){
	var data=[],selectHtml="";
	
	//本地数据
	if(localData){
		
		data=localData;
	
		if(data.length>=0){
			selectHtml="<option value=''>请选择</option>";
			for(var i in data){
				if(!data[i]["parentId"]||data[i]["parentId"]==null){
					var code=data[i]["code"];
					var name=data[i]["name"];
					selectHtml+="<option value='"+code+"' ";
					if(data[i].selected) 
						selectHtml+="selected='selected' ";
					selectHtml+=">"+name+"</option>";
				}
			}
			
		}
	}
	//ajax请求数据
	else if(ajaxData){
		
		data=ajaxData;
	
		if(data.length>=0){
			selectHtml="<option value=''>请选择</option>";
			for(var i in data){
				var code=data[i]["code"];
				var name=data[i]["name"];
				selectHtml+="<option value='"+code+"' ";
//				if(data[i].selected) 
//					selectHtml+="selected='selected' ";
				selectHtml+=">"+name+"</option>";
				
			}
			
		}
	}
	if(p.options){
		//android ics theme
		var selectOption=$.extend(selectOption1,p.options);
		$select.html(selectHtml);
		$select.mobiscroll().select(selectOption);
	}
	else{
		$select.html(selectHtml);
		$select.mobiscroll().select(selectOption1);
	}
	
}

//渲染级联关系select控件
var renderCascadeSelect=function(p,$select){
	var cascadeData=[],cascadeSelectHtml="";
	var cascadeSelectId=$select.attr("cascade-select");
	if(cascadeSelectId){
		var $cascadeSelect=$select.parent(".cascade-select").find("select[id='"+cascadeSelectId+"']");	
		$select.bind("change",function(){
				var level=$(this).attr("level");
				if(level){
					var cascadeIds=[];
					cascadeIds=getCascadeSelects(level,$(this),cascadeIds);
					for(var i in cascadeIds){
					   refreshSelectDom(p,cascadeIds[i]);
					}
				}
				var selectedCode=$select.val(),parentId="";
				//本地级联
				if(p.localData){
					if(selectedCode&&selectedCode!=""){
						for(var i in p.localData){
							if(p.localData[i]["code"]==selectedCode)
								parentId=p.localData[i]["id"];
						}
						
					}
					cascadeData=queryLocalCascadeDictionary(p.localData,parentId,cascadeData);
				}
				
				//im字典组件级联
				if(p.catalog){
					if(selectedCode&&selectedCode!=""){
						p.xpath=p.catalog+"/default/*[@code='"+selectedCode+"']/";
						var nextLevel=parseInt(level)+1;
						var value=$select.parent(".cascade-select").find("select[level='"+nextLevel+"']").attr("name");
						if(value)
						   p.xpath+=value;
						cascadeData=queryDictionary(p,cascadeData);
						
					}
					
				}
				if(cascadeData.length>=0){
					cascadeSelectHtml="<option value=''>请选择</option>";
					for(var i in cascadeData){
							var code=cascadeData[i]["code"];
							var name=cascadeData[i]["name"];
							cascadeSelectHtml+="<option value='"+code+"' ";
							if(cascadeData[i].selected) 
								cascadeSelectHtml+="selected='selected' ";
							cascadeSelectHtml+=">"+name+"</option>";
					}
					
					
					
				}
				
				if(p.options){
					//android ics theme
					var selectOption=$.extend(selectOption1,p.options);
					$cascadeSelect.html(cascadeSelectHtml);
					$cascadeSelect.mobiscroll().select(selectOption);
				}
				else{
					$cascadeSelect.html(cascadeSelectHtml);
					$cascadeSelect.mobiscroll().select(selectOption1);
				}
				
			});
			//多重级联
			if($cascadeSelect.attr("cascade-select")){
				renderCascadeSelect(p,$cascadeSelect);
			}
			
		
	
		
	}
}


//查询ajax数据(支持NewtouchOne-im组件)
//dictionary格式:[{"code":"beijing","name":"北京",id:"",parentId:""}];
var queryDictionary=function(p,source){
	var action;
	if(p.server) 
//		return;
		action=p.server;
	else
		action="queryDictionaries";
	Newtouch.Ajax.navigationSendParams(p, action, function(data){
		source=data;
	},function(err){
		$(document).mobileMsgBox({msgText:err,msgType:"alert"});
	},true);
	return source;

	
}

//本地数据查询（级联）
var queryLocalCascadeDictionary=function(data,parentId,cascadeSource){
	cascadeSource=[];
	for(var i in data){
		if(data[i]["parentId"]==parentId)
			cascadeSource.push(data[i]);
		
	}
	
	return cascadeSource;
	
}

//重置select
var refreshSelectDom=function(p,$select){
	if($select){
		if(p.options){
			//android ics theme
			var selectOption=$.extend(selectOption1,p.options);
			$select.html("<option value=''>请选择</option>");
			$select.mobiscroll().select(selectOption);
		}
		else{
			$select.html("<option value=''>请选择</option>");
			$select.mobiscroll().select(selectOption1);
		}
	}
}

//级联链
var getCascadeSelects=function(level,$select,cascadeIds){
	var selects=$select.parent(".cascade-select").find("select[level='"+level+"']").nextAll("select");
	selects.each(function(index,dom){
		var select=$(dom);
		cascadeIds.push(select);
		
	});
	return cascadeIds;
}

//default android theme
var selectOption1={
        theme: 'android',
        lang: 'zh',
        display: 'modal',
        mode: 'mixed',
        inputClass: 'icons-select',
        width: 200
}


//自动初始化
	
$.mobile.document.bind("pagecreate create",function(e){
		var pagecontainer=$(e.target);
		return $(":jqmData(role='select')",pagecontainer).each(function(index,dom){
		   $(dom).mobileSelect();
		});
});	
	
	
})(jQuery);


//selectMenu

!function($) {
    var Selectpicker = function(element, options, e) {
        if (e ) {
            e.stopPropagation();
            e.preventDefault();
        }
        this.$element = $(element);
        this.$newElement = null;
        this.button = null;

        //Merge defaults, options and data-attributes to make our options
        this.options = $.extend({}, $.fn.selectpicker.defaults, this.$element.data(), typeof options == 'object' && options);

        //If we have no title yet, check the attribute 'title' (this is missed by jq as its not a data-attribute
        if(this.options.title==null)
            this.options.title = this.$element.attr('title');

        //Expose public methods
        this.val = Selectpicker.prototype.val;
        this.render = Selectpicker.prototype.render;
        this.init();
    };

    Selectpicker.prototype = {

        constructor: Selectpicker,

        init: function (e) {
            var _this = this;
            this.multiple = this.$element.prop('multiple');
            var classList = this.$element.attr('class') !== undefined ? this.$element.attr('class').split(/\s+/) : '';
            var id = this.$element.attr('id');
            this.$element.wrap("<div class='ui-select'></div>").after( this.createView() );
            this.$newElement = this.$element.next('.select');
            var select = this.$newElement;
            this.button = this.$newElement.find('>button');
            this.button.addClass(this.options.style);
            
            if(this.options.menuStyle!=null){
            	    this.$element.hide();
		            var menu = this.$newElement.find('.dropdown-menu');
		            var menuArrow = this.$newElement.find('.dropdown-arrow');
		            var menuA = menu.find('li > a');
		            var liHeight = select.find('.dropdown-menu li > a').outerHeight();
		            //select.removeClass('isopen');
		            var divHeight = menu.find('li .divider').outerHeight(true);
		            var selectOffset_top = this.$newElement.offset().top;
		            var size = 0;
		            var menuHeight = 0;
		            var selectHeight = this.$newElement.outerHeight();
		            //this.button = this.$newElement.find('> button');
		            this.button.attr("data-toggle","dropdown");
		            if (id !== undefined) {
//		            	this.button.attr('id', id);
//		            	this.button.focus(function(){ select.addClass('isopen'); });
		            }
		            for (var i = 0; i < classList.length; i++) {
		            	if(classList[i] != 'selectpicker') {
		            		this.$newElement.addClass(classList[i]);
		            	}
		            }
		            //If we are multiple, then add the show-tick class by default
		            if(this.multiple) {
		            	this.$newElement.addClass('select-multiple');
		            }
		            menu.addClass(this.options.menuStyle);
		            menuArrow.addClass(function() {
		            	if (_this.options.menuStyle) {
//                    return _this.options.menuStyle.replace('dropdown-', 'dropdown-arrow-');
		            	}
		            });
		            var menuPadding = parseInt(menu.css('padding-top')) + parseInt(menu.css('padding-bottom')) + parseInt(menu.css('border-top-width')) + parseInt(menu.css('border-bottom-width'));
		            if (this.options.size == 'auto') {
		            	function getSize() {
		            		var selectOffset_top_scroll = selectOffset_top - $(window).scrollTop();
		            		var windowHeight = window.innerHeight;
		            		var menuExtras = menuPadding + parseInt(menu.css('margin-top')) + parseInt(menu.css('margin-bottom')) + 2;
		            		var selectOffset_bot = windowHeight - selectOffset_top_scroll - selectHeight - menuExtras;
		            		menuHeight = selectOffset_bot;
		            		if (select.hasClass('dropup')) {
		            			menuHeight = selectOffset_top_scroll - menuExtras;
		            		}
		            		menu.css({'max-height' : menuHeight + 'px', 'overflow-y' : 'auto', 'min-height' : liHeight*2 + 'px'});
		            	}
		            	getSize();
		            	$(window).resize(getSize);
		            	$(window).scroll(getSize);
		            	this.$element.bind('DOMNodeInserted', getSize);
		            } else if (this.options.size && this.options.size != 'auto' && menu.find('li').length > this.options.size) {
		            	var optIndex = menu.find("li > *").filter(':not(.divider)').slice(0,this.options.size).last().parent().index();
		            	var divLength = menu.find("li").slice(0,optIndex + 1).find('.divider').length;
		            	menuHeight = liHeight*this.options.size + divLength*divHeight + menuPadding;
		            	menu.css({'max-height' : menuHeight + 'px', 'overflow-y' : 'scroll'});
		            }
		            this.$element.bind('DOMNodeInserted', $.proxy(this.reloadLi, this));
		            this.checkTabIndex();
            }

            this.checkDisabled();
            this.clickListener();
            //Listen for updates to the DOM and re render...

            this.render();
        },

        createDropdown: function() {
            var drop =
                 "<div class='btn-group select'>" +
                    "<button class='btn' >" +
                        "<span class='filter-option pull-left'></span>" +      
                    "</button>" +
                    '<a  data-toggle="dropdown" class="btn  dropdown-toggle"><span class="caret"></span></a>'+
                    "<ul class='dropdown-menu' role='menu'>" +
                    "</ul>" +
                "</div>";

            return $(drop);
        },


        createView: function() {
            var $drop = this.createDropdown();
            var $li = this.createLi();
            $drop.find('ul').append($li);
            return $drop;
        },

        reloadLi: function() {
            //Remove all children.
            this.destroyLi();
            //Re build
            $li = this.createLi();
            this.$newElement.find('ul').append( $li );
            //render view
            this.render();
        },

        destroyLi:function() {
            this.$newElement.find('li').remove();
        },

        createLi: function() {

            var _this = this;
            var _li = [];
            var _liA = [];
            var _liHtml = '';

            this.$element.find('option').each(function(){
                _li.push($(this).text());
            });

            this.$element.find('option').each(function(index) {
                //Get the class and text for the option
                var optionClass = $(this).attr("class") !== undefined ? $(this).attr("class") : '';
               	var text =  $(this).text();
               	var subtext = $(this).data('subtext') !== undefined ? '<small class="muted">'+$(this).data('subtext')+'</small>' : '';

                //Append any subtext to the main text.
                text+=subtext;

                if ($(this).parent().is('optgroup') && $(this).data('divider') != true) {
                    if ($(this).index() == 0) {
                        //Get the opt group label
                        var label = $(this).parent().attr('label');
                        var labelSubtext = $(this).parent().data('subtext') !== undefined ? '<small class="muted">'+$(this).parent().data('subtext')+'</small>' : '';
                        label += labelSubtext;

                        if ($(this)[0].index != 0) {
                            _liA.push(
                                '<div class="divider"></div>'+
                                '<dt>'+label+'</dt>'+ 
                                _this.createA(text, "opt " + optionClass )
                                );
                        } else {
                            _liA.push(
                                '<dt>'+label+'</dt>'+ 
                                _this.createA(text, "opt " + optionClass ));
                        }
                    } else {
                         _liA.push( _this.createA(text, "opt " + optionClass )  );
                    }
                } else if ($(this).data('divider') == true) {
                    _liA.push('<div class="divider"></div>');
                } else {
                    _liA.push( _this.createA(text, optionClass ) );
                }
            });

            if (_li.length > 0) {
                for (var i = 0; i < _li.length; i++) {
                    var $option = this.$element.find('option').eq(i);
                    _liHtml += "<li rel=" + i + ">" + _liA[i] + "</li>";
                }
            }

            //If we dont have a selected item, and we dont have a title, select the first element so something is set in the button
            if(this.$element.find('option:selected').length==0 && !_this.options.title) {
                this.$element.find('option').eq(0).prop('selected', true).attr('selected', 'selected');
            }

            return $(_liHtml);
        },

        createA:function(test, classes) {
         return '<a tabindex="-1" href="#" class="'+classes+'">' +
                 '<span class="pull-left">' + test + '</span>' +
                 '</a>';

        },

         render:function() {
            var _this = this;

            //Set width of select
             if (this.options.width == 'auto') {
                 var ulWidth = this.$newElement.find('.dropdown-menu').css('width');
                 this.$newElement.css('width',ulWidth);
             } else if (this.options.width && this.options.width != 'auto') {
                 this.$newElement.css('width',this.options.width);
                 this.$newElement.find(">button").css('width',this.options.width);
             }

            //Update the LI to match the SELECT
            this.$element.find('option').each(function(index) {
               _this.setDisabled(index, $(this).is(':disabled') || $(this).parent().is(':disabled') );
               _this.setSelected(index, $(this).is(':selected') );
            });



            var selectedItems = this.$element.find('option:selected').map(function(index,value) {
                if($(this).attr('title')!=undefined) {
                    return $(this).attr('title');
                } else {
                    return $(this).text();
                }
            }).toArray();

            //Convert all the values into a comma delimited string    
            var title = selectedItems.join(", ");

            //If this is multi select, and the selectText type is count, the show 1 of 2 selected etc..                    
            if(_this.multiple && _this.options.selectedTextFormat.indexOf('count') > -1) {
                var max = _this.options.selectedTextFormat.split(">");
                if( (max.length>1 && selectedItems.length > max[1]) || (max.length==1 && selectedItems.length>=2)) {
                    title = selectedItems.length +' of ' + this.$element.find('option').length + ' selected';
                }
             }  
            
            //If we dont have a title, then use the default, or if nothing is set at all, use the not selected text
            if(!title) {
                title = _this.options.title != undefined ? _this.options.title : _this.options.noneSelectedText;    
            }
            
            this.$element.next('.select').find('.filter-option').html( title );
	    },
	    
        
        
        setSelected:function(index, selected) {
            if(selected) {
                this.$newElement.find('li').eq(index).addClass('selected');
            } else {
                this.$newElement.find('li').eq(index).removeClass('selected');
            }
        },
        
        setDisabled:function(index, disabled) {
            if(disabled) {
                this.$newElement.find('li').eq(index).addClass('disabled');
            } else {
                this.$newElement.find('li').eq(index).removeClass('disabled');
            }
        },
       
        checkDisabled: function() {
            if (this.$element.is(':disabled')) {
                this.button.addClass('disabled');
                this.button.click(function(e) {
                    e.preventDefault();
                });
            }
        },
		
		checkTabIndex: function() {
			if (this.$element.is('[tabindex]')) {
				var tabindex = this.$element.attr("tabindex");
				this.button.attr('tabindex', tabindex);
			}
		},
		
		clickListener: function() {
            var _this = this;
            
            $('body').on('touchstart.dropdown', '.dropdown-menu', function (e) { e.stopPropagation(); });
            
           
            
            this.$newElement.on('click', 'li a', function(e){
                var clickedIndex = $(this).parent().index(),
                    $this = $(this).parent(),
                    $select = $this.parents('.select');
                
                
                //Dont close on multi choice menu    
                if(_this.multiple) {
                    e.stopPropagation();
                }
                
                e.preventDefault();
                
                //Dont run if we have been disabled
                if ($select.prev('select').not(':disabled') && !$(this).parent().hasClass('disabled')){
                    //Deselect all others if not multi select box
                    if (!_this.multiple) {
                        $select.prev('select').find('option').removeAttr('selected');
                        $select.prev('select').find('option').eq(clickedIndex).prop('selected', true).attr('selected', 'selected');
                    } 
                    //Else toggle the one we have chosen if we are multi selet.
                    else {
                        var selected = $select.prev('select').find('option').eq(clickedIndex).prop('selected');
                        
                        if(selected) {
                            $select.prev('select').find('option').eq(clickedIndex).removeAttr('selected');
                        } else {
                            $select.prev('select').find('option').eq(clickedIndex).prop('selected', true).attr('selected', 'selected');
                        }
                    }
                    
                    
                    $select.find('.filter-option').html($this.text());
                    //$select.find('button').focus();

                    // Trigger select 'change'
                    $select.prev('select').trigger('change');
                }

            });
            
           this.$newElement.on('click', 'li.disabled a, li dt, li .divider', function(e) {
                e.preventDefault();
                e.stopPropagation();
                $select = $(this).parent().parents('.select');
               // $select.find('button').focus();
            });

            this.$element.on('change', function(e) {
                _this.render();
            });
        },
        
        val:function(value) {
            
            if(value!=undefined) {
                this.$element.val( value );
                this.$element.trigger('change');
                return this.$element;
            } else {
                return this.$element.val();
            }
        }

    };

    $.fn.selectpicker = function(option, event) {
       //get the args of the outer function..
       var args = arguments;
       var value;
       var chain = this.each(function () {
            var $this = $(this),
                data = $this.data('selectpicker'),
                options = typeof option == 'object' && option;
            
            if (!data) {
            	$this.data('selectpicker', (data = new Selectpicker(this, options, event)));
            } else {
            	for(var i in option) {
            		data[i]=option[i];
            	}
            }
            
            if (typeof option == 'string') {
                //Copy the value of option, as once we shift the arguments
                //it also shifts the value of option.
                property = option;
                if(data[property] instanceof Function) {
                    [].shift.apply(args);
                    value = data[property].apply(data, args);
                } else {
                    value = data[property];
                }
            }
        });
        
        if(value!=undefined) {
            return value;
        } else {
            return chain;
        } 
    };

    $.fn.selectpicker.defaults = {
        style: null,
        size: 'auto',
        title: null,
        selectedTextFormat : 'values',
        noneSelectedText : '',
        width: null,
        menuStyle:null,
        toggleSize: null
    }

}(window.jQuery);